package com.hzw.saas.service.old.hub.service;

import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;

import com.hzw.saas.common.util.enums.ConflictModeEnum;
import com.hzw.saas.service.old.hub.pojo.FileStorage;
import cn.hutool.core.io.IORuntimeException;

/**
 * 文件存储接口
 * 路径参数均支持绝对路径和相对路径，相对路径的根路径为classpath
 *
 * @author zzl
 * @since 04/20/2021
 */
public interface IFileStorageService {

    /**
     * 获取文件
     *
     * @param fileName   文件名
     * @param superPaths 上级路径
     * @return 文件
     */
    File getFile(String fileName, String... superPaths);

    /**
     * 文件是否存在
     *
     * @param fileName   文件名
     * @param superPaths 上级路径
     * @return true-存在，false-不存在
     */
    boolean existsFile(String fileName, String... superPaths);

    /**
     * 获取文件长度
     *
     * @param fileName   文件名
     * @param superPaths 上级路径
     * @return 文件长度，当文件不存在时，返回负数
     */
    long getFileLength(String fileName, String... superPaths);

    /**
     * 获取文件MD5值
     *
     * @param digestType 摘要类型，支持md5,sha1,sha256。为空或其他则默认使用md5
     * @param fileName   文件名
     * @param superPaths 上级路径
     * @return 文件摘要，当文件不存在时，返回空字符串
     */
    String getFileDigest(String digestType, String fileName, String... superPaths);

    /**
     * 创建目录
     * 支持多级创建
     *
     * @param path       目录相对路径
     * @param superPaths 上级路径
     * @return 创建的目录
     * @throws IORuntimeException e
     */
    File mkFolder(String path, String... superPaths) throws IORuntimeException;

    /**
     * 创建目录
     * 支持多级创建
     *
     * @param folder 待创建的目录
     * @return 创建的目录
     */
    File mkFolder(File folder);

    /**
     * 保存文件
     *
     * @param fileInfo 文件信息
     * @param in       文件输入流
     * @param mode     同名冲突解决方式
     * @return 保存的文件
     * @throws IORuntimeException check FileAlreadyExistsException
     */
    File saveFile(FileStorage fileInfo, InputStream in, ConflictModeEnum mode) throws IORuntimeException;

    /**
     * 保存文件
     *
     * @param fileInfo 文件信息
     * @param inFile   待保存文件
     * @param mode     同名冲突解决方式
     * @return 保存的文件
     * @throws IORuntimeException check FileAlreadyExistsException
     */
    File saveFile(FileStorage fileInfo, File inFile, ConflictModeEnum mode) throws IORuntimeException;

    /**
     * 保存文件
     *
     * @param fileInfo 文件信息
     * @param data     文件数据
     * @param mode     同名冲突解决方式
     * @return 保存的文件
     * @throws IORuntimeException check FileAlreadyExistsException
     */
    File saveFile(FileStorage fileInfo, byte[] data, ConflictModeEnum mode) throws IORuntimeException;

    /**
     * 重命名文件
     *
     * @param superPath 父路径
     * @param srcName   原文件名
     * @param tarName   新文件名
     * @param mode      同名冲突解决方式
     * @return 重命名的文件
     * @throws IORuntimeException check FileAlreadyExistsException，FileNotFoundException
     */
    File renameFile(String superPath, String srcName, String tarName, ConflictModeEnum mode) throws IORuntimeException;

    /**
     * 重命名文件
     *
     * @param srcFile 待重命名文件
     * @param tarName 新文件名
     * @param mode    名冲突解决方式
     * @return 重命名的文件
     * @throws IORuntimeException check FileAlreadyExistsException，FileNotFoundException
     */
    File renameFile(File srcFile, String tarName, ConflictModeEnum mode) throws IORuntimeException;

    /**
     * 复制文件
     *
     * @param srcSuperPath 原父路径
     * @param srcName      原文件名
     * @param tarSuperPath 目标父路径
     * @param tarName      目标文件名
     * @param mode         同名冲突解决方式
     * @return 复制的文件
     * @throws IORuntimeException check FileAlreadyExistsException，FileNotFoundException
     */
    File copyFile(String srcSuperPath, String srcName, String tarSuperPath, String tarName, ConflictModeEnum mode) throws IORuntimeException;

    /**
     * 复制文件
     *
     * @param srcFile 原文件
     * @param tarFile 目标文件
     * @param mode    同名冲突解决方式
     * @return 复制的文件
     * @throws IORuntimeException check FileAlreadyExistsException，FileNotFoundException
     */
    File copyFile(File srcFile, File tarFile, ConflictModeEnum mode) throws IORuntimeException;

    /**
     * 移动文件
     *
     * @param srcSuperPath 原父路径
     * @param srcName      原文件名
     * @param tarSuperPath 目标父路径
     * @param tarName      目标文件名
     * @param mode         同名冲突解决方式
     * @return 移动后的文件
     * @throws IORuntimeException check FileAlreadyExistsException，FileNotFoundException
     */
    File moveFile(String srcSuperPath, String srcName, String tarSuperPath, String tarName, ConflictModeEnum mode) throws IORuntimeException;

    /**
     * 移动文件
     *
     * @param srcFile 原文件
     * @param tarFile 目标文件
     * @param mode    同名冲突解决方式
     * @return 目标文件（可能已重命名）
     * @throws IORuntimeException check FileAlreadyExistsException，FileNotFoundException
     */
    File moveFile(File srcFile, File tarFile, ConflictModeEnum mode) throws IORuntimeException;

    /**
     * 移除文件
     *
     * @param rf         强制删除(文件夹存在文件时)
     * @param fileName   文件名
     * @param superPaths 父路径
     * @throws IORuntimeException check FileNotFoundException
     */
    void deleteFile(boolean rf, String fileName, String... superPaths) throws IORuntimeException;

    /**
     * 移除文件
     *
     * @param rf   强制删除(文件夹存在文件时)
     * @param file 待删除文件
     * @throws IORuntimeException check FileNotFoundException
     */
    void deleteFile(boolean rf, File file) throws IORuntimeException;

    /**
     * 下载文件
     *
     * @param os         输出流
     * @param skipBytes  跳过字节数
     * @param fileName   文件名
     * @param superPaths 父路径
     * @throws IORuntimeException check FileNotFoundException
     */
    void downloadFile(OutputStream os, long skipBytes, String fileName, String... superPaths) throws IORuntimeException;

}
